iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

這章節要介紹讓我腦洞大開的一個sort方法,merge sort。

Merge Sort在CS61B很前面介紹Asymptotics的章節就會提到,然後後面的章節會再提到一遍,不過我比較喜歡前面Asymptotics的介紹方法,所以會引用這段推導來說明Merge Sort。

我們知道Selection Sort的runtime會是$O(N^2)$,假設我們定義一個時間單位叫做AU(arbitrary units of time),而以下N長度的list透過selection sort所要花費的時間大約為$N^2$:

01

而假設我們有兩個sort好的list,把他們merge成一個sorted list所要花費的runtime會是Θ(N):

02

精彩的來了!如果原本要花費大約4096AU的N=64 list,如果把它拆成兩個N=32的list,各自做完selection sort後再merge,總共runtime會是多少呢:

03

各自N=32會花費1024AU * 2,再加上最後merge的64AU,總共是2112AU!

老天鵝,我們只是換一個做法,runtime就直接減少快一半了!而且你說這是什麼很難很複雜的操作嗎?也沒有!

這樣就很屌了,但還有更猛的。我們只是把原本的list分兩半就獲得很顯著的效果了,讓我們更貪心一點,不要只分成2份,2份再繼續分成4份:

04

4份繼續分成8份!8份繼續分…….直到分成64份!每一份就只有一個元素!最終會是384AU:

05

我們來用代數看看,若是分到只有一個元素後,不斷每層每層merge上來,最終runtime會是Θ(N log N)!

06

真的很猛。

Slides are from Josh Hug CS61B
license
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License


上一篇
Day25-Heap Sort
下一篇
Day27-Quick Sort
系列文
資料結構與演算法-CS61B學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言